Requirements
- if not all dependencies are satisfied by R environment, try to install additional libraries
dplyr, ggplot2, tidyr, Hmisc
- loading libraries
[1] "Required package(s) dplyr, ggplot2, tidyr, Hmisc are already installed."
[1] "Required package(s) dplyr, ggplot2, tidyr, Hmisc are loaded."
Sample overview
Data import
- Checking if result file(s) are available:
- Importing result table(s):
[1] "Import of counts table complete."
Quality control
Total number of mapped reads per sample

Number of individual barcodes per sample

Number of missing barcodes per sample

Number of barcodes per gene, per sample
`summarise()` has grouped output by 'sample'. You can override using the
`.groups` argument.

Read count distribution, per sample (capped at 1000 barcodes)

Number of reads per barcode, per sample

Top 10 most abundant barcodes, per sample

Cumulative read count distribution and population equality

Sample and replicate correlation coefficent (R)

Sample and replicate similarity with PCA

Report info
The template for this report is located in ./nf-core-crispriscreen/bin/counts_summary.Rmd.
Date: 2022-04-28
Author: Michael Jahn, PhD
Affilations:
- Science For Life Laboratory (KTH), Stockholm, Sweden
- Max-Planck-Unit for the Science of Pathogens, Berlin, Germany
Session Info
R version 4.3.2 (2023-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.3 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=sv_SE.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=sv_SE.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=sv_SE.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=sv_SE.UTF-8 LC_IDENTIFICATION=C
time zone: Europe/Stockholm
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Hmisc_5.1-1 tidyr_1.3.0 ggplot2_3.4.4 dplyr_1.0.10
loaded via a namespace (and not attached):
[1] sass_0.4.7 utf8_1.2.4 generics_0.1.3 stringi_1.7.12
[5] digest_0.6.33 magrittr_2.0.3 evaluate_0.23 grid_4.3.2
[9] fastmap_1.1.1 jsonlite_1.8.7 nnet_7.3-19 backports_1.4.1
[13] DBI_1.1.3 Formula_1.2-5 gridExtra_2.3 purrr_1.0.2
[17] fansi_1.0.5 scales_1.2.1 jquerylib_0.1.4 cli_3.6.1
[21] rlang_1.1.2 munsell_0.5.0 base64enc_0.1-3 withr_2.5.0
[25] cachem_1.0.8 yaml_2.3.7 tools_4.3.2 checkmate_2.1.0
[29] htmlTable_2.4.2 colorspace_2.1-0 assertthat_0.2.1 vctrs_0.6.4
[33] R6_2.5.1 rpart_4.1.23 lifecycle_1.0.4 stringr_1.5.0
[37] htmlwidgets_1.5.4 foreign_0.8-86 cluster_2.1.6 pkgconfig_2.0.3
[41] pillar_1.9.0 bslib_0.5.1 gtable_0.3.4 data.table_1.14.8
[45] glue_1.6.2 highr_0.10 xfun_0.41 tibble_3.2.1
[49] tidyselect_1.2.0 rstudioapi_0.14 knitr_1.45 farver_2.1.1
[53] htmltools_0.5.7 labeling_0.4.2 rmarkdown_2.25 compiler_4.3.2
LS0tCnRpdGxlOiAiUmVhZCBjb3VudHMgc3VtbWFyeSIKYXV0aG9yOiAiU1lTVEVNOiBgciB2ZXJzaW9uWzEzXWAiCmRhdGU6ICJEQVRFOiBgciBTeXMudGltZSgpYCIKcGFyYW1zOgogIGNwdXM6IDIKICBhcnRpZmFjdF9kaXI6IGFydGlmYWN0cwogIGlucHV0X2RpcjogLi8KICBtZXRhOiAiIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpgYGAKCiMgUmVxdWlyZW1lbnRzCgotIGlmIG5vdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgUiBlbnZpcm9ubWVudCwgdHJ5IHRvIGluc3RhbGwgYWRkaXRpb25hbCBsaWJyYXJpZXMgYGRwbHlyYCwgYGdncGxvdDJgLCBgdGlkeXJgLCBgSG1pc2NgCi0gbG9hZGluZyBsaWJyYXJpZXMKCmBgYHtyfQpsaXN0X3JlcV9wYWNrYWdlcyA8LSBjKCJkcGx5ciIsICJnZ3Bsb3QyIiwgInRpZHlyIiwgIkhtaXNjIikKbGlzdF90b19pbnN0YWxsIDwtIHNldGRpZmYobGlzdF9yZXFfcGFja2FnZXMsIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKSkKCmlmIChsZW5ndGgobGlzdF90b19pbnN0YWxsKSkgewogICAgcGtkaXIgPC0gcGFzdGUwKHN5c3RlbSgiZWNobyAke0hPTUV9IiwgaW50ZXJuID0gVFJVRSksICIvLlIiKQogICAgc3lzdGVtKHBhc3RlMCgibWtkaXIgIiwgcGtkaXIpKQogICAgLmxpYlBhdGhzKG5ldyA9IHBrZGlyKQogICAgaW5zdGFsbC5wYWNrYWdlcyhwa2dzID0gbGlzdF90b19pbnN0YWxsLCBsaWIgPSBwa2RpcikKICAgIHByaW50KHBhc3RlMCgiTWlzc2luZyBwYWNrYWdlKHMpICIsIHBhc3RlKGxpc3RfdG9faW5zdGFsbCwgY29sbGFwc2UgPSAiLCAiKSwgIiBhcmUgaW5zdGFsbGVkIHRvICciLCBwa2RpciwgIicuIikpCn0gZWxzZSB7CiAgICBwcmludChwYXN0ZTAoIlJlcXVpcmVkIHBhY2thZ2UocykgIiwgcGFzdGUobGlzdF9yZXFfcGFja2FnZXMsIGNvbGxhcHNlID0gIiwgIiksICIgYXJlIGFscmVhZHkgaW5zdGFsbGVkLiIpKQp9CmBgYAoKLSBsb2FkaW5nIGxpYnJhcmllcwoKYGBge3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgICBmb3IgKHBrZyBpbiBsaXN0X3JlcV9wYWNrYWdlcykgewogICAgICAgIGxpYnJhcnkocGtnLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCiAgICB9Cn0pCnByaW50KHBhc3RlMCgiUmVxdWlyZWQgcGFja2FnZShzKSAiLCBwYXN0ZShsaXN0X3JlcV9wYWNrYWdlcywgY29sbGFwc2UgPSAiLCAiKSwgIiBhcmUgbG9hZGVkLiIpKQpgYGAKCiMgU2FtcGxlIG92ZXJ2aWV3CgojIyBEYXRhIGltcG9ydAoKLSBDaGVja2luZyBpZiByZXN1bHQgZmlsZShzKSBhcmUgYXZhaWxhYmxlOgoKYGBge3J9CiMgZ2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKd2QgPC0gZ2V0d2QoKQppbnB1dF9wYXR0ZXJuIDwtICJhbGxfY291bnRzLnRzdiIKCiMgY2hlY2sgaW5wdXQgZmlsZXMgYW5kIGNvbXBpbGUgc21hbGwgdGFibGUKaW5wdXRfZmlsZXMgPC0gZ3JlcChsaXN0LmZpbGVzKHdkKSwgcGF0dGVybiA9IGlucHV0X3BhdHRlcm4sIHZhbHVlID0gVFJVRSkKaWYgKGxlbmd0aChpbnB1dF9maWxlcykgPT0gMSkgewogICAgZGZfaW5wdXQgPC0gYmluZF9jb2xzKAogICAgICAgIGRhdGEuZnJhbWUoaW5wdXRfZmlsZXMpLAogICAgICAgIGZpbGUuaW5mbyhwYXN0ZSh3ZCwgaW5wdXRfZmlsZXMsIHNlcCA9ICIvIikpCiAgICApICU+JQogICAgICAgIG11dGF0ZShzaXplID0gcGFzdGUoc2l6ZSAvIDFlNiwgIk1CIikpCiAgICByb3duYW1lcyhkZl9pbnB1dCkgPC0gTlVMTAogICAgZGZfaW5wdXRbYygxLCAyLCAzLCA0LCA1LCAxMCldCn0gZWxzZSB7CiAgICBzdG9wKHBhc3RlMCgiUmVxdWlyZWQgaW5wdXQgZmlsZShzKSAnIiwgaW5wdXRfcGF0dGVybiwgIicgd2VyZSBub3QgZm91bmQuIikpCn0KYGBgCgotIEltcG9ydGluZyByZXN1bHQgdGFibGUocyk6CgpgYGB7cn0KIyBsb2FkIGNvdW50cyBtYXRyaXgKZGZfY291bnRzIDwtIHJlYWQuZGVsaW0ocGFzdGUwKHdkLCAiLyIsIGlucHV0X3BhdHRlcm4pKQpkZl9jb3VudHMgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihkZl9jb3VudHMsCiAgICBjb2xzID0gMzpuY29sKGRmX2NvdW50cyksCiAgICBuYW1lc190byA9ICJzYW1wbGUiLCB2YWx1ZXNfdG8gPSAibl9yZWFkcyIKKQojIHNvcnQKZGZfY291bnRzIDwtIGFycmFuZ2UoZGZfY291bnRzLCBzYW1wbGUpCnByaW50KCJJbXBvcnQgb2YgY291bnRzIHRhYmxlIGNvbXBsZXRlLiIpCmBgYAoKIyMgU2FtcGxlIHRhYmxlCgotIG92ZXJ2aWV3IG9mIHNhbXBsZXMKCmBgYHtyfQojIGxpc3Qgb2Ygc2FtcGxlcyArIGdlbmVyaWMgb3B0aW9ucwpsaXN0X3NhbXBsZXMgPC0gdW5pcXVlKGRmX2NvdW50cyRzYW1wbGUpCmZpZ3dpZHRoIDwtIDkKZmlnaGVpZ2h0IDwtIHJvdW5kKDEgKyAobGVuZ3RoKGxpc3Rfc2FtcGxlcykgLyA0KSkKZmlnaGVpZ2h0MiA8LSAzICogZmlnaGVpZ2h0CgojIG91dHB1dCBzYW1wbGUgdGFibGUKdGVzdCA8LSBkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlKSAlPiUKICAgIGRwbHlyOjpzdW1tYXJpemUoCiAgICAgICAgYmFyY29kZXMgPSBsZW5ndGgodW5pcXVlKHNnUk5BKSksCiAgICAgICAgdG90YWxfcmVhZHMgPSBzdW0obl9yZWFkcywgbmEucm0gPSBUUlVFKSwKICAgICAgICBtaW5fcmVhZHMgPSBtaW4obl9yZWFkcywgbmEucm0gPSBUUlVFKSwKICAgICAgICBtZWFuX3JlYWRzID0gbWVhbihuX3JlYWRzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgIG1heF9yZWFkcyA9IG1heChuX3JlYWRzLCBuYS5ybSA9IFRSVUUpLAogICAgKQpgYGAKCiMgUXVhbGl0eSBjb250cm9sCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQojIGRlZmluZSBhIGN1c3RvbSBnZ3Bsb3QyIHRoZW1lIChqdXN0IGZvciBwcmV0dGluZXNzKQojIGN1c3RvbSBnZ3Bsb3QyIHRoZW1lIHRoYXQgaXMgcmV1c2VkIGZvciBhbGwgbGF0ZXIgcGxvdHMKY3VzdG9tX2NvbG9ycyA8LSBjKCIjRTcyOThBIiwgIiM2NkE2MUUiLCAiI0U2QUIwMiIsICIjNzU3MEIzIiwgIiNCM0IzQjMiLCAiIzFCOUU3NyIsICIjRDk1RjAyIiwgIiNBNjc2MUQiKQpjdXN0b21fcmFuZ2UgPC0gZnVuY3Rpb24obiA9IDUpIHsKICAgIGNvbG9yUmFtcFBhbGV0dGUoY3VzdG9tX2NvbG9yc1tjKDEsIDUsIDIpXSkobikKfQoKY3VzdG9tX3RoZW1lIDwtIGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2xpbmVfc2l6ZSA9IDEuMCwgYmFzZV9yZWN0X3NpemUgPSAxLjAsIC4uLikgewogICAgdGhlbWVfbGlnaHQoYmFzZV9zaXplID0gYmFzZV9zaXplLCBiYXNlX2xpbmVfc2l6ZSA9IGJhc2VfbGluZV9zaXplLCBiYXNlX3JlY3Rfc2l6ZSA9IGJhc2VfcmVjdF9zaXplKSArIHRoZW1lKAogICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IGdyZXkoMC40KSwgc2l6ZSA9IDEwKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxMiwgMTIsIDEyLCAxMiksICJwb2ludHMiKSwKICAgICAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoMC4yLCAiY20iKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9IGdyZXkoMC40KSwgbGluZXR5cGUgPSAic29saWQiLCBsaW5lZW5kID0gInJvdW5kIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gZ3JleSgwLjQpLCBzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IGdyZXkoMC40KSwgc2l6ZSA9IDEwKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjYsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyID0gZ3JleSgwLjkpKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9IGdyZXkoMC40KSwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSBncmV5KDAuNCksIHNpemUgPSAxMCwgbWFyZ2luID0gdW5pdChyZXAoMywgNCksICJwb2ludHMiKSksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gZ3JleSgwLjQpLCBzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAuLi4KICAgICkKfQpgYGAKCiMjIFRvdGFsIG51bWJlciBvZiBtYXBwZWQgcmVhZHMgcGVyIHNhbXBsZQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0LCB3YXJuaW5nID0gRkFMU0V9CmRmX2NvdW50cyAlPiUKICAgIGRwbHlyOjpncm91cF9ieShzYW1wbGUpICU+JQogICAgZHBseXI6OnN1bW1hcml6ZShuX3JlYWRzID0gc3VtKG5fcmVhZHMpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IG5fcmVhZHMpKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgZ2VvbV9jb2woZmlsbCA9IGN1c3RvbV9jb2xvcnNbMV0sIGFscGhhID0gMC43KSArCiAgICBsYWJzKHggPSAiIiwgeSA9ICJ0b3RhbCBudW1iZXIgb2YgbWFwcGVkIHJlYWRzIikgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBOdW1iZXIgb2YgaW5kaXZpZHVhbCBiYXJjb2RlcyBwZXIgc2FtcGxlCgpgYGB7ciwgZmlnLndpZHRoID0gZmlnd2lkdGgsIGZpZy5oZWlnaHQgPSBmaWdoZWlnaHQsIHdhcm5pbmcgPSBGQUxTRX0KZGZfY291bnRzICU+JQogICAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZSkgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXplKGB1bmlxdWUgYmFyY29kZXMgcGVyIHNhbXBsZWAgPSBzdW0obl9yZWFkcyA+IDApKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IGB1bmlxdWUgYmFyY29kZXMgcGVyIHNhbXBsZWApKSArCiAgICBnZW9tX2NvbChmaWxsID0gY3VzdG9tX2NvbG9yc1sxXSwgYWxwaGEgPSAwLjcpICsKICAgIGxhYnMoeCA9ICIiKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBOdW1iZXIgb2YgbWlzc2luZyBiYXJjb2RlcyBwZXIgc2FtcGxlCgpgYGB7ciwgZmlnLndpZHRoID0gZmlnd2lkdGgsIGZpZy5oZWlnaHQgPSBmaWdoZWlnaHQsIHdhcm5pbmcgPSBGQUxTRX0KZGZfY291bnRzICU+JQogICAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZSkgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXplKGBtaXNzaW5nIGJhcmNvZGVzIHBlciBzYW1wbGVgID0gc3VtKG5fcmVhZHMgPT0gMCkpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gc2FtcGxlLCB5ID0gYG1pc3NpbmcgYmFyY29kZXMgcGVyIHNhbXBsZWApKSArCiAgICBnZW9tX2NvbChmaWxsID0gY3VzdG9tX2NvbG9yc1sxXSwgYWxwaGEgPSAwLjcpICsKICAgIGxhYnMoeCA9ICIiKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBOdW1iZXIgb2YgYmFyY29kZXMgcGVyIGdlbmUsIHBlciBzYW1wbGUKCmBgYHtyLCBmaWcud2lkdGggPSBmaWd3aWR0aCwgZmlnLmhlaWdodCA9IGZpZ2hlaWdodCwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlLCBHZW5lKSAlPiUKICAgIGRwbHlyOjpzdW1tYXJpemUoYHVuaXF1ZSBiYXJjb2Rlc2AgPSBsZW5ndGgodW5pcXVlKHNnUk5BKSkpICU+JQogICAgZHBseXI6OmNvdW50KGB1bmlxdWUgYmFyY29kZXNgKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IG4sIGZpbGwgPSBmYWN0b3IoYHVuaXF1ZSBiYXJjb2Rlc2ApKSkgKwogICAgZ2VvbV9jb2woYWxwaGEgPSAwLjcpICsKICAgIGdlb21fdGV4dChhZXMoCiAgICAgICAgeCA9IHNhbXBsZSwKICAgICAgICB5ID0gdW5saXN0KCh0YXBwbHkobiwgc2FtcGxlLCBmdW5jdGlvbih4KSBjdW1zdW0ocmV2KHgpKSAtIChyZXYoeCkgLyAyKSkpKSwKICAgICAgICBsYWJlbCA9IHJldihgdW5pcXVlIGJhcmNvZGVzYCkKICAgICksIGNvbG9yID0gIndoaXRlIikgKwogICAgbGFicyh4ID0gIiIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvclJhbXBQYWxldHRlKGN1c3RvbV9jb2xvcnNbMTo1XSkoOSkpICsKICAgIGN1c3RvbV90aGVtZShsZWdlbmQucG9zaXRpb24gPSAwKQpgYGAKCiMjIFJlYWQgY291bnQgZGlzdHJpYnV0aW9uLCBwZXIgc2FtcGxlIChjYXBwZWQgYXQgMTAwMCBiYXJjb2RlcykKCmBgYHtyLCBmaWcud2lkdGggPSBmaWd3aWR0aCwgZmlnLmhlaWdodCA9IGZpZ2hlaWdodCwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlKSAlPiUKICAgIGRwbHlyOjpzbGljZSgxOjEwMDApICU+JQogICAgZ2dwbG90KGFlcyh4ID0gc2FtcGxlLCB5ID0gbG9nMTAobl9yZWFkcykpKSArCiAgICBnZW9tX3Zpb2xpbigKICAgICAgICB0cmltID0gRkFMU0UsIGZpbGwgPSBjdXN0b21fY29sb3JzWzFdLAogICAgICAgIGFscGhhID0gMC43LCBjb2wgPSAid2hpdGUiCiAgICApICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX3NkbCwgZ2VvbSA9ICJwb2ludHJhbmdlIiwgc2l6ZSA9IDAuNSwgY29sID0gZ3JleSgwLjMpKSArCiAgICBjdXN0b21fdGhlbWUoKQpgYGAKCiMjIE51bWJlciBvZiByZWFkcyBwZXIgYmFyY29kZSwgcGVyIHNhbXBsZQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0Miwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2cyKG5fcmVhZHMpKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IGN1c3RvbV9jb2xvcnNbMV0sIGFscGhhID0gMC43LCBiaW5zID0gMzApICsKICAgIGxhYnMoeSA9ICIiLCB4ID0gZXhwcmVzc2lvbigibG9nIlsyXSAqICIgcmVhZHMgcGVyIGJhcmNvZGUiKSkgKwogICAgZmFjZXRfd3JhcCh+c2FtcGxlLCBuY29sID0gMikgKwogICAgY3VzdG9tX3RoZW1lKCkKYGBgCgojIyBUb3AgMTAgbW9zdCBhYnVuZGFudCBiYXJjb2RlcywgcGVyIHNhbXBsZQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0Miwgd2FybmluZyA9IEZBTFNFfQpkZl9jb3VudHMgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlKSAlPiUKICAgIGRwbHlyOjphcnJhbmdlKHNhbXBsZSwgZGVzYyhuX3JlYWRzKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHJhbmsgPSBzZXFfYWxvbmcoc2dSTkEpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoYmV0d2VlbihyYW5rLCAxLCAxMCkpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHJhbmspLCB5ID0gbl9yZWFkcykpICsKICAgIGdlb21fY29sKGZpbGwgPSBjdXN0b21fY29sb3JzWzFdLCBhbHBoYSA9IDAuNywgd2lkdGggPSAxKSArCiAgICBsYWJzKHkgPSAibiByZWFkcyIsIHggPSAiYmFyY29kZXMgcmFua2VkIGJ5IGFidW5kYW5jZSIpICsKICAgIGZhY2V0X3dyYXAofnNhbXBsZSwgbmNvbCA9IDIpICsKICAgIGN1c3RvbV90aGVtZSgpCmBgYAoKIyMgQ3VtdWxhdGl2ZSByZWFkIGNvdW50IGRpc3RyaWJ1dGlvbiBhbmQgcG9wdWxhdGlvbiBlcXVhbGl0eQoKYGBge3IsIGZpZy53aWR0aCA9IGZpZ3dpZHRoLCBmaWcuaGVpZ2h0ID0gZmlnaGVpZ2h0Miwgd2FybmluZyA9IEZBTFNFfQpkZl9hdWMgPC0gZGZfY291bnRzICU+JQogICAgZHBseXI6OmFycmFuZ2Uoc2FtcGxlLCBkZXNjKG5fcmVhZHMpKSAlPiUKICAgIGRwbHlyOjpncm91cF9ieShzYW1wbGUpICU+JQogICAgZHBseXI6Om11dGF0ZSgKICAgICAgICBwY19iYXJjb2RlcyA9IDEwMCAqIHNlcV9hbG9uZyhuX3JlYWRzKSAvIG4oKSwKICAgICAgICBwY19yZWFkcyA9IDEwMCAqIG5fcmVhZHMgLyAoc3VtKG5fcmVhZHMpKQogICAgKSAlPiUKICAgIGRwbHlyOjptdXRhdGUocGNfYmFyY29kZXMgPSByb3VuZChwY19iYXJjb2RlcykpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZSwgcGNfYmFyY29kZXMpICU+JQogICAgZHBseXI6OnN1bW1hcml6ZShwY19yZWFkcyA9IHN1bShwY19yZWFkcyksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHBjX3JlYWRzID0gY3Vtc3VtKHBjX3JlYWRzKSkKCmRmX2F1YyAlPiUKICAgIGdncGxvdChhZXMoeCA9IHBjX2JhcmNvZGVzLCB5ID0gcGNfcmVhZHMsIGdyb3VwID0gc2FtcGxlKSkgKwogICAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEuMCwgY29sb3IgPSBjdXN0b21fY29sb3JzWzFdKSArCiAgICBnZW9tX2FibGluZSgKICAgICAgICBzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IDEuMCwKICAgICAgICBsaW5ldHlwZSA9IDIsIGNvbG9yID0gZ3JleSgwLjUpCiAgICApICsKICAgIGZhY2V0X3dyYXAofnNhbXBsZSwgbmNvbCA9IDIpICsKICAgIGxpbXMoeCA9IGMoMCwgMTAwKSwgeSA9IGMoMCwgMTAwKSkgKwogICAgbGFicyh4ID0gIiUgb2YgYmFyY29kZXMiLCB5ID0gIiUgb2YgcmVhZHMiKSArCiAgICBjdXN0b21fdGhlbWUoKQpgYGAKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9CmNhbGNfYXVjIDwtIGZ1bmN0aW9uKHgsIHkpIHsKICAgIHN1bShkaWZmKHgpICogKGhlYWQoeSwgLTEpICsgdGFpbCh5LCAtMSkpKSAvIDIKfQpkZl9hdWMgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXplKAogICAgICAgIGF1YyA9IGNhbGNfYXVjKHBjX2JhcmNvZGVzLCBwY19yZWFkcyksCiAgICAgICAgZ2luaSA9IChhdWMgLSA1MDAwKSAvIDUwMDAKICAgICkgJT4lCiAgICBtdXRhdGUocXVhbGl0eSA9IGNhc2Vfd2hlbigKICAgICAgICBnaW5pIDw9IDAuMiB+ICJPSyIsCiAgICAgICAgZ2luaSA+IDAuMiAmIGdpbmkgPD0gMC41IH4gIndhcm5pbmc6IGluZXF1YWwgcmVhZCBkaXN0cmlidXRpb24iLAogICAgICAgIGdpbmkgPiAwLjUgfiAid2FybmluZzogZXh0cmVtZWx5IGluZXF1YWwgcmVhZCBkaXN0cmlidXRpb24iCiAgICApKQpgYGAKCgojIyBTYW1wbGUgYW5kIHJlcGxpY2F0ZSBjb3JyZWxhdGlvbiBjb2VmZmljZW50IChSKQoKYGBge3IsIGZpZy53aWR0aCA9IDcuNSwgZmlnLmhlaWdodCA9IDcsIHdhcm5pbmcgPSBGQUxTRX0KZGZfY291bnRzICU+JQogICAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAic2FtcGxlIiwgdmFsdWVzX2Zyb20gPSAibl9yZWFkcyIpICU+JQogICAgZHBseXI6OnNlbGVjdCgtYygxOjIpKSAlPiUKICAgIGNvcigpICU+JQogICAgZHBseXI6OmFzX3RpYmJsZSgpICU+JQogICAgZHBseXI6Om11dGF0ZShzYW1wbGUxID0gY29sbmFtZXMoLikpICU+JQogICAgdGlkeXI6OnBpdm90X2xvbmdlcigKICAgICAgICBjb2xzID0gIXNhbXBsZTEsCiAgICAgICAgbmFtZXNfdG8gPSAic2FtcGxlMiIsIHZhbHVlc190byA9ICJjb3JfY29lZiIKICAgICkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBzYW1wbGUxLCB5ID0gc2FtcGxlMiwgZmlsbCA9IGNvcl9jb2VmKSkgKwogICAgZ2VvbV90aWxlKCkgKwogICAgZ2VvbV90ZXh0KGNvbG9yID0gZ3JleSgwLjQpLCBhZXMobGFiZWwgPSByb3VuZChjb3JfY29lZiwgMikpKSArCiAgICBjdXN0b21fdGhlbWUoKSArCiAgICBsYWJzKHRpdGxlID0gIiIsIHggPSAiIiwgeSA9ICIiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudG4oCiAgICAgICAgY29sb3VycyA9IGMoY3VzdG9tX2NvbG9yc1sxXSwgZ3JleSgwLjkpLCBjdXN0b21fY29sb3JzWzJdKSwKICAgICAgICBsaW1pdHMgPSBjKC0xLCAxKQogICAgKQpgYGAKCiMjIFNhbXBsZSBhbmQgcmVwbGljYXRlIHNpbWlsYXJpdHkgd2l0aCBQQ0EKCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gNywgd2FybmluZyA9IEZBTFNFfQpwY2FfcmVzdWx0IDwtIGRmX2NvdW50cyAlPiUKICAgIHRpZHlyOjpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gInNhbXBsZSIsIHZhbHVlc19mcm9tID0gIm5fcmVhZHMiKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoLWMoMToyKSkgJT4lCiAgICBhcy5tYXRyaXgoKSAlPiUKICAgIHQoKSAlPiUKICAgIHJlcGxhY2UoLiwgaXMubmEoLiksIDApICU+JQogICAgcHJjb21wKCkKCmRmX1BDQSA8LSBwY2FfcmVzdWx0JHggJT4lCiAgICBhc190aWJibGUocm93bmFtZXMgPSAic2FtcGxlIikKCmRmX1BDQSAlPiUKICAgIGdncGxvdChhZXMoeCA9IFBDMSwgeSA9IC1QQzIsIHNpemUgPSBQQzMsIGNvbG9yID0gc2FtcGxlLCBsYWJlbCA9IHNhbXBsZSkpICsKICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICAgIGdlb21fdGV4dChzaXplID0gMi41LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBsYWJzKAogICAgICAgIHRpdGxlID0gIlBDQSwgZmlyc3QgdGhyZWUgcHJpbmNpcGFsIGNvbXBvbmVudHMiLAogICAgICAgIHN1YnRpdGxlID0gIlBvaW50IHNpemUgZW5jb2RlcyBQQzMiLCB4ID0gIlBDMSIsIHkgPSAiUEMyIgogICAgKSArCiAgICBjdXN0b21fdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gMCwgYXNwZWN0ID0gMSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yUmFtcFBhbGV0dGUoY3VzdG9tX2NvbG9ycykobnJvdyhkZl9QQ0EpKSkgKwogICAgZ3VpZGVzKHNpemUgPSAibm9uZSIpCmBgYAoKIyBSZXBvcnQgaW5mbwoKVGhlIHRlbXBsYXRlIGZvciB0aGlzIHJlcG9ydCBpcyBsb2NhdGVkIGluIGAuL25mLWNvcmUtY3Jpc3ByaXNjcmVlbi9iaW4vY291bnRzX3N1bW1hcnkuUm1kYC4KCkRhdGU6IDIwMjItMDQtMjgKCkF1dGhvcjogTWljaGFlbCBKYWhuLCBQaEQKCkFmZmlsYXRpb25zOgoKICAtIFNjaWVuY2UgRm9yIExpZmUgTGFib3JhdG9yeSAoS1RIKSwgU3RvY2tob2xtLCBTd2VkZW4KICAtIE1heC1QbGFuY2stVW5pdCBmb3IgdGhlIFNjaWVuY2Ugb2YgUGF0aG9nZW5zLCBCZXJsaW4sIEdlcm1hbnkKCiMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK